<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>index19-数组扩充</title>
</head>
<body>
  <script type="text/javascript">
      // every
      // let arr = [1, 2, 3, 4, 5];

      // every
      // let result = arr.every((item, index, array) => {
      //   console.log(item, index, array);
      //   // return true;
      //   return item > 2;
      // });
      // console.log(result);

      // let result = arr.every((item, index, array) => {
      //   console.log(item, index, array);
      //   // return true;
      //   return item > 0;
      // });
      // console.log(result);

      // some
      // let result = arr.some(item => {
      //   console.log(item);
      //   // return false;
      //   // return item > 0;
      //   return item > 10;
      // });
      // console.log(result);

      // map——提取
      // let arr = [12,35,56,79,56];
      // let arr2 = arr.map(item => item % 2 === 0 ? '偶数' : '奇数');
      // console.log(arr);
      // console.log(arr2);
      // let arr3 = arr.map((item, index) => index + ":" + item);
      // console.log(arr3);

      // filter——过滤
      // let arr = [12,75,56,79,56];
      // let arr2 = arr.filter(item => item >= 60);
      // console.log(arr);
      // console.log(arr2);

      // reduce
      // let arr = [12,35,56,79,56];
      // // 回调函数的第一个参数在第一次循环时记录的是数组第一个元素，但从第二次循环时记录的是上一次循环的返回值
      // let result = arr.reduce((tmp, value, index) => {
      //   tmp += value;
      //   // 计算平均值
      //   if (index === arr.length - 1) {
      //     tmp /= arr.length;
      //   }
      //   return tmp;
      // });
      // console.log(result);

      // reduce函数可以接收两个参数，第一个参数是回调函数，如果指定第二参数，那么第二个参数就是tmp的初始值
      // let array = [10, 20, 30,40, 50, 60];
      // let result = array.reduce((tmp, value, index) => {
      //     console.log(tmp, value, index);
      //     return tmp + value;
      // });
      // console.log(result); // 210
      // let result = array.reduce((tmp, value, index) => {
      //     console.log(tmp, value, index);
      //     return tmp + value;
      // }, 1000);
      // console.log(result);

      // 给array数组中的每个元素乘以10，再求和
      // let result = array.map(item => item * 10).reduce((tmp, value) => {
      //     return tmp + value;
      // }, 0);
      // console.log(result);

      // 数组去重
      // let array = [1, 2, 1, 2, 3, 5, 4, 5, 3, 4, 4, 4, 4];
      // let result = array.sort().reduce((tmp, value) => {
      //     // tmp本身是空的  或   tmp中的最后一个值和value不相等
      //     if (tmp.length === 0 || tmp[tmp.length - 1] !== value) {
      //         tmp.push(value);
      //     }
      //     return tmp;
      // }, []);
      // console.log(result);

      // 分组统计性别
      // let persons = [{
      //     name: '张三',
      //     gender: '男',
      //     age: 20
      // }, {
      //     name: '李四',
      //     gender: '女',
      //     age: 22
      // }, {
      //     name: '王五',
      //     gender: '女',
      //     age: 23
      // }, {
      //     name: '赵六',
      //     gender: '女',
      //     age: 26
      // },{
      //     name: '赵六',
      //     gender: '女',
      //     age: 26
      // }];
      // let result = persons.reduce((tmp, value) => {
      //     tmp[value['gender']]++;
      //     return tmp;
      // }, {'男': 0,'女': 0});
      // console.log(result);

      // 过滤出成绩大于等于60分中给成绩大于等于80分的人的人数加5，然后计算总分
      // let scores = [10, 30, 40, 60, 70, 80, 90, 95];
      // //  60, 70, 80, 90, 95--->60, 70, 85, 95, 100--->410
      // let result = scores.filter(item => item >= 60)
      //     .map(item => item >= 80 ? item + 5 : item)
      //     .reduce((tmp, value) => {
      //         return tmp + value;
      //     }, 0);
      // console.log(result);

      let students = [
          {
              name: "张三",
              age: 25,
              gender: "女",
              score: 100
          }, {
              name: "张三三",
              age: 26,
              gender: "男",
              score: 70
          }, {
              name: "李三四",
              age: 27,
              gender: "女",
              score: 80
          }, {
              name: "张三五",
              age: 28,
              gender: "男",
              score: 60
          }, {
              name: "张三六",
              age: 29,
              gender: "男",
              score: 80
          }, {
              name: "李四",
              age: 25,
              gender: "男",
              score: 90
          }, {
              name: "张三七",
              age: 31,
              gender: "男",
              score: 90
          },
      ];
      // 统计名字中含有三且年龄在20-30之间学生，按照性别分组统计平均分、总分、人数
      let result = students.filter(item => item.name.includes("三") && (item.age >= 20 && item.age <= 30))
          .reduce((tmp, value, index, array) => {
              console.log(index, array);
              tmp[value['gender']].count++;
              tmp[value['gender']].score += value.score;
              // 判断是否在最后一个，如果是遍历最后一个就可以计算平均分
              if (index === array.length - 1) {
                  tmp['男'].avgScore = tmp['男'].score / tmp['男'].count;
                  tmp['女'].avgScore = tmp['女'].score / tmp['女'].count;
              }
              return tmp;
          }, {"男": {count: 0, score: 0}, "女": {count: 0, score: 0}});
      console.log(result);
  </script>
</body>
</html>